const obj = {
	a: {
		b: 1,
		c: 2,
		d: {
			e: 5
		}
	},
	b: [1, 3, {
		a: 2,
		b: 3
	}],
	c: 3
}

function flatten(obj) {
	let res = {}

	function dfs(cur, prefix) { // prefix参数是为了拿到保留上一级的键
		if (typeof cur === 'object' && cur !== null) { // 递归结束条件
			if (Array.isArray(cur)) { // 拿到数组的拼接方式
				cur.forEach((item, index) => {
					dfs(item, `${prefix}[${index}]`)
				});
			} else {
				for (let key in cur) { // 拿到对象的拼接方式
					dfs(cur[key], `${prefix}${prefix ? '.' : ''}${key}`) // 将上一级的键与这一级的键进行拼接
				}
			}
		} else {
			res[prefix] = cur
		}
	}
	// 第一次
	dfs(obj, '')
	return res
}
console.log(flatten(obj));
// {
//   'a.b': 1,
//   'a.c': 2,
//   'a.d.e': 5,
//   'b[0]': 1,
//   'b[1]': 3,
//   'b[2].a': 2,
//   'b[2].b': 3,
//   c: 3
// }
